在深入研究 SyntaxVisitor 之前,讓我們先介紹一個重要的工具。
由katsumi大 所提供的 Swift AST Explorer
SyntaxVisitor
的所有 function
會以 visit(node: XXXSyntax) -> SyntaxVisitorContinueKind
形式重複出現
舉例來說,如果我們想要訪問 IdentifierExprSyntax
,只需將 XXXSyntax
替換為 IdentifierExprSyntax
,如下所示:
final class MyVisitor: SyntaxVisitor {
override final func visit(
_ node: IdentifierExprSyntax
) -> SyntaxVisitorContinueKind {
return .visitChildren
}
}
在我們訪問特定節點後,我們需要決定下一步該怎麼做。
visitChildren
: 繼續訪問子節點skipChildren
: 跳過子節點讓我們以第四天的例子來說明:
.varDecl(
letKeyword: .let,
varName: .id("test"),
equal: .equal,
content: .functionCall(
functionName: .id("process"),
leftParent: "(",
args: [.id("x")],
rightParent: ")",
)
)
這個 visitor 可以訪問到以下 id:
final class MyVisitor: SyntaxVisitor {
override final func visit(
_ node: Expr.id
) -> SyntaxVisitorContinueKind {
return .visitChildren
}
}
這個 visitor 就只能訪問到 id
final class MyVisitor: SyntaxVisitor {
override final func visit(
_ node: Expr.id
) -> SyntaxVisitorContinueKind {
return .visitChildren
}
override final func visit(
_ node: Expr.functionCall
) -> SyntaxVisitorContinueKind {
return .skipChildren
}
}
這些範例說明了如何使用 SyntaxVisitor
來訪問和處理 AST 中的不同節點。